/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.deployment.manager.consultar;

import br.com.deployment.entidade.protocolo.Pagamento;
import br.com.deployment.entidade.protocolo.Protocolo;
import br.com.deployment.entidade.protocolo.ServicoProtocolo;
import br.com.deployment.entidade.selo.TipoSelo;
import br.com.deployment.servico.LancamentoServico;
import br.com.deployment.servico.ParcelaServico;
import br.com.deployment.servico.ProtocoloServico;
import br.com.deployment.servico.SeloServico;
import br.com.deployment.servico.TipoSeloServico;
import br.com.deployment.util.VisaoLista;
import java.io.Serializable;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.*;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import org.primefaces.model.chart.CartesianChartModel;
import org.primefaces.model.chart.ChartSeries;

/**
 *
 * @author elyjr
 */
@ManagedBean
@SessionScoped
public class ManagerConsultarPesquisarCaixa implements Serializable{

    @EJB
    ProtocoloServico protocoloServico;
    @EJB
    ParcelaServico parcelaServico;
    @EJB
    LancamentoServico lancamentoServico;
    
    @EJB
    TipoSeloServico tipoSeloServico;
    
    List<TipoSelo> tipoSelos;
    
    @EJB
    SeloServico seloServico;
    
    private List<VisaoLista> lstvisaoLista;
    
    private List<Protocolo> lstProtocolo;
    private List<Pagamento> lstPagamento;
    Date dataini, datafim;
    BigDecimal valorCartorio;
    BigDecimal valorFermojupi;
    BigDecimal valorPagamento;
    BigDecimal valorTotal;
    BigDecimal valorRecebido;
    BigDecimal valorAReceber;
    Integer qtdProtocolo;
    Integer qtdSelos;
    BigDecimal valorTotalMesCaixa;
    BigDecimal valorTotalMesCartorio;
    BigDecimal valorTotalMesFermoJupi;
    private CartesianChartModel categoryModel;
    
    int cont;
    

    public ManagerConsultarPesquisarCaixa() {
    }

    @PostConstruct
    public void init() {
        lstProtocolo = new ArrayList<Protocolo>();
        lstPagamento = new ArrayList<Pagamento>();
        valorCartorio = new BigDecimal(0);
        valorFermojupi = new BigDecimal(0);
        valorPagamento = new BigDecimal(0);
        valorTotal = new BigDecimal(0);
        valorRecebido = new BigDecimal(0);
        valorAReceber = new BigDecimal(0);
        qtdProtocolo = new Integer(0);
        valorTotalMesCaixa = new BigDecimal(0);
        valorTotalMesCartorio = new BigDecimal(0);
        valorTotalMesFermoJupi = new BigDecimal(0);
        categoryModel = new CartesianChartModel();
        lstvisaoLista = new ArrayList<VisaoLista>();
        createCategoryModel();
    }


     
    private void createCategoryModel() {
        categoryModel = new CartesianChartModel();
        
        ChartSeries graMes = new ChartSeries();
        graMes.setLabel("Valores");
        
        HashMap<Integer, String> meses = new HashMap<Integer, String>();
        meses.put(1, "JAN");
        meses.put(2, "FEV");
        meses.put(3, "MAR");
        meses.put(4, "ABR");
        meses.put(5, "MAI");
        meses.put(6, "JUN");
        meses.put(7, "JUL");
        meses.put(8, "AGO");
        meses.put(9, "SET");
        meses.put(10, "OUT");
        meses.put(11, "NOV");
        meses.put(12, "DEZ");
        
        GregorianCalendar gc = new GregorianCalendar();
        int dia = 1;
        int mes = gc.get(Calendar.MONTH);
        int ano = gc.get(Calendar.YEAR);
        
        Calendar c = Calendar.getInstance();
        Calendar d = Calendar.getInstance();
        
        d.set(ano, mes - 2, dia);
        c.set(ano, mes - 1, dia);

        mes = mes - 2;
        for (int i = 0; i <= 2; i++) {
            
            
                BigDecimal valor =
                    protocoloServico.protocoloCaixaMesBig(d.getTime(), 
                        ((!c.after(new Date())) ? c.getTime(): new Date()) );
            
            System.err.println("Data: "+d.getTime()+" week "+c.getTime() + ""+ valor);
            graMes.set(meses.get(mes + i + 1 ), valor);
            d.add(Calendar.MONTH, 1);
            c.add(Calendar.MONTH, 1);
            
            
            if(valor.intValue() > cont){
                cont = valor.intValue() + (valor.intValue() / 10);
            }
            
        }
        categoryModel.addSeries(graMes);
    }

    
    
    public void pesquisar() {
        
        lstProtocolo = protocoloServico.pesquisarCaixaProtocolo(dataini, datafim);
        lstPagamento = protocoloServico.pesquisarCaixaPagamento(dataini, datafim);

        valorPagamento = resultadoValorPagamento();


        qtdProtocolo = qtdProtocolos();
        qtdSelos = qtdSelos();
        createCategoryModel();
        calculosMes();
        atribuiValores();
        seloEstoque();
    }
    
    

    public BigDecimal calculosMes() {
        valorTotalMesCaixa = new BigDecimal(0);
        valorTotalMesCartorio = new BigDecimal(0);
        valorTotalMesFermoJupi = new BigDecimal(0);
        for (Protocolo p : lstProtocolo) {
            p.setServicoProtocolos(protocoloServico.servicoProtocolos(p));
            valorTotalMesCartorio = valorTotalMesCartorio.add(p.getValorTotalCartorio());
            valorTotalMesFermoJupi = valorTotalMesFermoJupi.add(p.getValorTotalFermojupi());

            for (ServicoProtocolo sp : p.getServicoProtocolos()) {
                valorTotalMesCaixa = valorTotalMesCaixa.add(sp.getValor());
            }
        }
        return valorTotalMesCaixa;
    }

    public void atribuiValores() {
        

        valorRecebido = new BigDecimal(0);
        valorAReceber = new BigDecimal(0);
        valorTotal = new BigDecimal(0);
        valorCartorio = new BigDecimal(0);
        valorFermojupi = new BigDecimal(0);

        for (Protocolo p : lstProtocolo) {
            valorRecebido = lancamentoServico.totalPago(p.getDataCad());
            valorAReceber = lancamentoServico.totalAreceber(p.getDataCad());
            valorCartorio = valorCartorio.add(p.getValorTotalCartorio());
            valorFermojupi = valorFermojupi.add(p.getValorTotalFermojupi());

            p.setServicoProtocolos(protocoloServico.servicoProtocolos(p));
            for (ServicoProtocolo sp : p.getServicoProtocolos()) {
                valorTotal = valorTotal.add(sp.getValor());
            }
        }

    }

    public BigDecimal valorDoProtocolo(Protocolo protocolo) {
        BigDecimal total = new BigDecimal(0);
        protocolo = protocoloServico.find(protocolo.getId());
        protocolo.setServicoProtocolos(protocoloServico.servicoProtocolos(protocolo));
        for (ServicoProtocolo sp : protocolo.getServicoProtocolos()) {
            total = total.add(sp.getValor());
        }
        return total;
    }

    public void seloEstoque() {
        VisaoLista v = new VisaoLista();
        tipoSelos = tipoSeloServico.findAll();
        for (TipoSelo tipo : tipoSelos) {
            Long n = seloServico.qtdSeloAll(tipo);
            v = new VisaoLista();
            v.setTipoSelo(tipo);
            v.setQtd(n);
           
            lstvisaoLista.add(v);
           
        }



    }
    
    
    public BigDecimal resultadoValorPagamento() {
        valorPagamento = new BigDecimal(0);
        for (Pagamento p : lstPagamento) {
            valorPagamento = valorPagamento.add(p.getValor());
        }

        return valorPagamento;

    }

    public Integer qtdProtocolos() {

        return qtdProtocolo = lstProtocolo.size();
    }

    public Integer qtdSelos() {
        qtdSelos = new Integer(0);
        for (Protocolo p : lstProtocolo) {
            p.setServicoProtocolos(protocoloServico.servicoProtocolos(p));
            for (ServicoProtocolo sp : p.getServicoProtocolos()) {
                qtdSelos += sp.getSelos() != null ? sp.getSelos().size() : 0;
            }

        }

        return qtdSelos;
    }

    public Date getDatafim() {
        return datafim;
    }

    public void setDatafim(Date datafim) {
        this.datafim = datafim;
    }

    public Date getDataini() {
        return dataini;
    }

    public void setDataini(Date dataini) {
        this.dataini = dataini;
    }

    public List<Pagamento> getLstPagamento() {
        return lstPagamento;
    }

    public void setLstPagamento(List<Pagamento> lstPagamento) {
        this.lstPagamento = lstPagamento;
    }

    public List<Protocolo> getLstProtocolo() {
        return lstProtocolo;
    }

    public void setLstProtocolo(List<Protocolo> lstProtocolo) {
        this.lstProtocolo = lstProtocolo;
    }

    public BigDecimal getValorCartorio() {
        return valorCartorio;
    }

    public void setValorCartorio(BigDecimal valorCartorio) {
        this.valorCartorio = valorCartorio;
    }

    public BigDecimal getValorFermojupi() {
        return valorFermojupi;
    }

    public void setValorFermojupi(BigDecimal valorFermojupi) {
        this.valorFermojupi = valorFermojupi;
    }

    public BigDecimal getValorPagamento() {

        return valorPagamento;
    }

    public void setValorPagamento(BigDecimal valorPagamento) {
        this.valorPagamento = valorPagamento;
    }

    public BigDecimal getValorTotal() {
        return valorTotal;
    }

    public void setValorTotal(BigDecimal valorTotal) {
        this.valorTotal = valorTotal;
    }

    public BigDecimal getValorRecebido() {
        return valorRecebido;
    }

    public void setValorRecebido(BigDecimal valorRecebido) {
        this.valorRecebido = valorRecebido;
    }

    public Integer getQtdProtocolo() {
        return qtdProtocolo;
    }

    public void setQtdProtocolo(Integer qtdProtocolo) {
        this.qtdProtocolo = qtdProtocolo;
    }

    public Integer getQtdSelos() {
        return qtdSelos;
    }

    public void setQtdSelos(Integer qtdSelos) {
        this.qtdSelos = qtdSelos;
    }

    public BigDecimal getValorTotalMesCaixa() {
        return valorTotalMesCaixa;
    }

    public void setValorTotalMesCaixa(BigDecimal valorTotalMesCaixa) {
        this.valorTotalMesCaixa = valorTotalMesCaixa;
    }

    public BigDecimal getValorTotalMesCartorio() {
        return valorTotalMesCartorio;
    }

    public void setValorTotalMesCartorio(BigDecimal valorTotalMesCartorio) {
        this.valorTotalMesCartorio = valorTotalMesCartorio;
    }

    public BigDecimal getValorTotalMesFermoJupi() {
        return valorTotalMesFermoJupi;
    }

    public void setValorTotalMesFermoJupi(BigDecimal valorTotalMesFermoJupi) {
        this.valorTotalMesFermoJupi = valorTotalMesFermoJupi;
    }

    public BigDecimal getValorAReceber() {
        return valorAReceber;
    }

    public void setValorAReceber(BigDecimal valorAReceber) {
        this.valorAReceber = valorAReceber;
    }

    public CartesianChartModel getCategoryModel() {
        return categoryModel;
    }

    public void setCategoryModel(CartesianChartModel categoryModel) {
        this.categoryModel = categoryModel;
    }

    public List<VisaoLista> getLstvisaoLista() {
        return lstvisaoLista;
    }

    public void setLstvisaoLista(List<VisaoLista> lstvisaoLista) {
        this.lstvisaoLista = lstvisaoLista;
    }

    public List<TipoSelo> getTipoSelos() {
        return tipoSelos;
    }

    public void setTipoSelos(List<TipoSelo> tipoSelos) {
        this.tipoSelos = tipoSelos;
    }
    
    
    
}